外观
2023年12月 GESP C++ 四级真题解析
一、单选题(每题2分,共30分)
选择题答案
| 题号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 答案 | A | B | D | C | C | C | A | B | A | A | D | A | C | B | B |
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限1. 下面有关函数参数的说法,正确的是()。
A. 函数参数传递时,主函数当中采用值传递方式将参数传递给子函数时,若子函数将参数值改变,主函数当中的参数值不变。
B. 函数参数传递时,主函数当中采用值传递方式将参数传递给子函数时,若子函数将参数值改变,主函数当中的参数值将随子函数一样改变而改变。
C. 函数参数传递时,主函数如果将参数的地址传递给子函数,若子函数将参数值改变,主函数当中的参数值将不改变。
D. 函数参数传递可以不满足子函数的参数个数要求。
查看解析
答案:A
考纲知识点: 函数参数传递
解析: 值传递不改变实参;地址传递或引用传递才会改变。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限2. 下面代码执行后,输出的是()。
cpp
int arr[10] = {1};
string strArr = "chen a dai";
cout << strArr[arr[1]] << endl;1
2
3
2
3
A. chen
B. c
C. chen a dai
D. dai
查看解析
答案:B
考纲知识点: 字符串索引
解析: arr[1] == 0,strArr[0] == 'c'。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限3. 下面代码最后执行后输出是()。
cpp
int fun1(int *n) { return *n * *n; }
int main() {
int arr[10] = {2};
arr[1] = fun1(arr);
cout << arr[1] << endl;
}1
2
3
4
5
6
2
3
4
5
6
A. 1
B. 2
C. 3
D. 4
查看解析
答案:D
考纲知识点: 指针函数返回值
解析: fun1(arr) == 2 * 2 = 4。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限4. 下面代码执行后的结果是()。
cpp
int arr[3][3] = {{1,2,3},{4,5,6},{7,8,9}};
for(int i=0;i<3;i++)
for(int j=2;j>=0;j--)
cout << arr[i][j] << " ";
cout << endl;1
2
3
4
5
2
3
4
5
A. 1 2 3 4 5 6 7 8 9
B. 3 2 1 6 5 4 9 8 7
C. 6 5 4 9 8 7 3 2 1
D. 9 8 7 6 5 4 3 2 1
查看解析
答案:B
考纲知识点: 二维数组遍历
解析: 每行倒序输出,结果为3 2 1 6 5 4 9 8 7。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限5. 下面代码执行后输出是()。
cpp
int arr[3] = {1,2,3};
int *p = NULL;
p = arr;
p++;
cout << *p << endl;1
2
3
4
5
2
3
4
5
A. 1,2,3
B. 1
C. 2
D. 3
查看解析
答案:C
考纲知识点: 指针运算
解析: p++指向下一个元素,*p == 2。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限6. 如果变量x的地址是0x6ffe14,下面代码执行以后输出的是()。
cpp
int *p = &x;
p++;
cout << p << endl;1
2
3
2
3
A. 0x6ffe11
B. 0x6ffe14
C. 0x6ffe18
D. 0x6ffe15
查看解析
答案:C
考纲知识点: 指针地址运算
解析: int* 加1地址加4字节,结果为0x6ffe18。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限7. 在C++中,执行下面代码后,输出的是()。
cpp
int point(int *p) { return *p * *p; }
int main() {
int a = 20;
int *p = &a;
*p = point(p);
cout << *p << endl;
}1
2
3
4
5
6
7
2
3
4
5
6
7
A. 400
B. 200
C. 20
D. 100
查看解析
答案:A
考纲知识点: 指针函数
解析: 20 * 20 = 400。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限8. 下列C++语句执行以后结果是true的是()。
A. 3 && false
B. 5 && 2
C. 101 && 000
D. 4 & true
查看解析
答案:B
考纲知识点: 逻辑运算
解析: 5 && 2 非零值相与,结果为true。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限9. 在如下代码中实现了对字符串中出现的26个字母的个数统计,横线处应填入是()。
cpp
string Str = "HELLO CHEN A DAI";
int strlen = str.length();
char alpha[26] = {65};
int cnt[26] = {0};
for (int i = 1; i < 26; i++)
__________; // 横线处1
2
3
4
5
6
2
3
4
5
6
A. alpha[i] = alpha[i-1] + 1;
B. alpha[i] = alpha[i] + 1;
C. alpha[i+1] = alpha[i] + 1;
D. alpha[i-1] = alpha[i] + 1;
查看解析
答案:A
考纲知识点: 字符数组初始化
解析: 生成连续字母表,需将前一个字符加1。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限10. 下面代码执行后生成的文件其字节数为()。
cpp
ofstream fout("1.txt");
for (int i = 1; i <= 10; i++) {
if (i % 5 == 0) {
int x = i;
fout << x;
} else {
char ch = 'A';
fout << ch;
}
}1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
A. 10
B. 16
C. 40
D. 24
查看解析
答案:A
考纲知识点: 文件写入字节数
解析: 共写入10个字符(9个'A'与1个'5'),每个字符1字节,总10字节。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限11. 下列代码输入1,2,3,4,执行后,将输出的是()。
cpp
string str = "";
cin >> str; // 用户输入 1,2,3,4
int len = str.length();
for (int i = 0; i < len; i++) {
if (str[i] >= '0' && str[i] <= '9')
cout << str[i];
else
cout << '#';
}1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
A. 1#4#
B. 1#3#
C. 1#2#3#4#
D. 1#2#3#4
查看解析
答案:D
考纲知识点: 字符串遍历与条件输出
解析: 输入字符串为 "1,2,3,4",逗号被替换为 #,数字保留,输出为 1#2#3#4。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限12. 以下代码用于实现每个整数对应的因数,如输入12,则输出 1 2 3 4 6 12;如输入18,则输出 1 2 3 6 9 18。横线处应填入代码是()。
cpp
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
if (__________) // 横线处
cout << i << " ";
}1
2
3
4
5
6
2
3
4
5
6
A. if (n % i == 0)
B. if (n / i == 0)
C. if (n % i != 0)
D. if (n / i != 0)
查看解析
答案:A
考纲知识点: 因数判定
解析: 只有当 n % i == 0 时,i 才是 n 的因数。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限13. 某公司新出了一款无人驾驶的小汽车,通过声控智能驾驶系统,乘客只要告诉汽车目的地,车子就能自动选择一条优化路线,告诉乘客后驶达那里。请问下面哪项不是驾驶系统完成选路所必须的。()
A. 麦克风
B. 扬声器
C. 油量表
D. 传感器
查看解析
答案:C
考纲知识点: 输入输出设备
解析: 油量表只用于油量监测,与路线选择无关。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限14. 现代计算机是指电子计算机,它所基于的是()体系结构。
A. 艾伦·图灵
B. 冯·诺依曼
C. 阿塔纳索夫
D. 埃克特-莫克利
查看解析
答案:B
考纲知识点: 计算机组成原理
解析: 现代计算机采用“冯·诺依曼”体系结构。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限15. 输入一个正整数N,想找出它所有相邻的因数对,比如输入12,因数对有(1,2)、(2,3)、(3,4)。下面哪段代码找不到所有的因数对?()
A. for(i=1;i<N;i++) if(!(N%i) && !(N%(i+1))) printf("(%d,%d)\n", i, i+1);
B. for(i=2;i<N;i++) if(!(N%i) && !(N%(i+1))) printf("(%d,%d)\n", i, i+1);
C. for(i=2;i<N/2;i++) if(!(N%(i-1)) && !(N%i)) printf("(%d,%d)\n", i-1, i);
D. for(i=1;i<N/2;i++) if(!(N%i) && !(N%(i+1))) printf("(%d,%d)\n", i, i+1);
查看解析
答案:B
考纲知识点: 循环边界判断
解析: 选项B从i=2开始,漏掉了(1,2)这一对,因此找不到所有相邻因数对。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限二、判断题(每题2分,共20分)
判断题答案
| 题号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
|---|---|---|---|---|---|---|---|---|---|---|
| 答案 | √ | √ | × | × | × | √ | √ | √ | × | √ |
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限1. C++的内置函数sort()支持数组的局部排序。例如int a[] = {10,9,8,7,6,5,4,3,2,1},可以用sort(a, a+5)排序成{6,7,8,9,10,5,4,3,2,1}。( )
查看解析
答案:√
考纲知识点: STL算法
解析: sort(a, a+5)仅对前5个元素排序,其余保持原顺序。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限2. 用递归法求n的阶乘,时间复杂度是O(n)。( )
查看解析
答案:√
考纲知识点: 递归时间复杂度
解析: 递归调用n次,每次常数操作,复杂度为O(n)。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限3. [(1,2)*2]*3在C++中是合法的表达式。( )
查看解析
答案:×
考纲知识点: 语法合法性
解析: 括号不能用于乘法表达式,应为(1+2)*2*3。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限4. 在下面的C++代码中,将对1.txt文件写入hello。( )
cpp
ifstream filein;
ofstream fileout;
filein.open("1.txt");
fileout << "hello";1
2
3
4
2
3
4
查看解析
答案:×
考纲知识点: 文件操作
解析: fileout未打开文件,写入失败。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限5. 文本文件1.txt第1行由01234共5个字符组成,其间没有空格,当用C++代码正常打开文件成功并执行如下代码以后,第1行长度为5。( )
cpp
ifstream filein;
int buff;
filein.open("1.txt");
filein >> buff;
cout << buff << endl;1
2
3
4
5
2
3
4
5
查看解析
答案:×
考纲知识点: 文件读取
解析: >>以整数方式读取,读入1234,长度为4。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限6. 执行C++代码cout << (5||2);后将输出1。( )
查看解析
答案:√
考纲知识点: 逻辑运算
解析: 5 || 2为真,输出1。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限7. 在C++中,两个字符串相加的运算符为+相当于字符串的合并运算。下面C++代码执行后,将输出chenadai。( )
cpp
string a = "chen";
string b = "a";
string c = "dai";
string name = a + b + c;
cout << name << endl;1
2
3
4
5
2
3
4
5
查看解析
答案:√
考纲知识点: 字符串拼接
解析: 输出结果为chenadai。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限8. C++内置函数sort()可以对整数、浮点数、字符数组进行从大到小、从小到大、局部排序。( )
查看解析
答案:√
考纲知识点: STL算法
解析: 通过自定义比较器或greater<int>()可实现各种排序。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限9. 小杨最近在准备考GESP,他用的Dev C++来练习和运行程序,所以Dev C++也是一个微型操作系统。( )
查看解析
答案:×
考纲知识点: 操作系统概念
解析: Dev C++ 是集成开发环境(IDE),并非操作系统。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限10. 任何一个while循环都可以转化为等价的for循环。( )
查看解析
答案:√
考纲知识点: 控制结构
解析: 所有 while 循环均可改写为等价的 for(;;) 形式。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限三、编程题(共50分)
1. 小杨的字典
题目描述
在遥远的星球,有两个国家 A 国和 B 国,他们使用着不同的语言:A 语言和 B 语言。小杨是 B 国的翻译官,他的工作是将 A 语言的文章翻译成 B 语言的文章。
为了顺利完成工作,小杨制作了一本字典,里面记录了 N 个 A 语言单词对应的 B 语言单词,这些单词均由 26 个小写英文字母组成。
请你写一个程序,帮助他根据这本字典翻译一段 A 语言文章。这段文章由标点符号 !()-[]{}\|;:'",./?<> 和一些 A 语言单词构成,每个单词之间必定由至少一个标点符号分割。程序需将所有 A 语言单词替换成对应的 B 语言翻译;若单词不在字典中,请使用大写 UNK` 替换。
例如:
字典中包含
abc → ad → def
则输入文章
abc.d.d.abc.abcd.1
输出
a.def.def.a.UNK.1
输入格式
- 第 1 行:整数
N(1 ≤ N ≤ 100)。 - 接下来
N行:每行两个空格分隔字符串A_word B_word,长度 ≤ 10。 - 最后一行:待翻译字符串
S,长度 ≤ 1000,仅含小写字母及上面列出的标点。
输出格式
一行,翻译后的结果。
样例输入1
text
2
abc a
d def
abc.d.d.abc.abcd.1
2
3
4
2
3
4
样例输出1
text
a.def.def.a.UNK.1
解题思路
查看解题思路
考纲知识点: 字符串处理、哈希表
步骤:
- 用
map<string,string>建立字典。 - 逐字符扫描,遇到字母组成单词。
- 遇到标点或结尾立即翻译单词并重置。
- 保留所有标点符号。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限参考程序
cpp
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <string>
#include <map>
#include <iostream>
using namespace std;
map<string, string> dict;
int main() {
int N;
cin >> N;
string word1, word2;
while (N--) {
cin >> word1 >> word2;
dict[word1] = word2;
}
string content;
cin >> content;
string word = "";
for (char c : content) {
if (c >= 'a' && c <= 'z') {
word += c;
} else {
if (!word.empty()) {
if (dict.count(word)) cout << dict[word];
else cout << "UNK";
word.clear();
}
cout << c;
}
}
if (!word.empty()) {
if (dict.count(word)) cout << dict[word];
else cout << "UNK";
}
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
2. 田忌赛马
题目描述
你要和田忌赛马。你们各自有 N 匹马,要进行 N 轮比赛,每轮各派一匹马决胜负。
你的马速依次为 u₁, u₂, …, u_N,田忌马速为 v₁, v₂, …, v_N。田忌按顺序出马。请安排你的出马顺序,使赢得最多轮次(你和⽥忌的所有马匹的速度两两不同,所以无平局)。
输入格式
- 第 1 行:整数
N(1 ≤ N ≤ 5×10⁴)。 - 第 2 行:N 个空格分隔整数,你的马速。
- 第 3 行:N 个空格分隔整数,田忌马速。
输出格式
一行,最多赢得的轮数。
样例输入1
text
3
1 3 5
2 4 61
2
3
2
3
样例输出1
21
解题思路
查看解题思路
考纲知识点: 贪心算法、排序
步骤:
- 双方马速排序。
- 双指针:用最小能赢的对最小,不能赢则最大对最大。
- 统计获胜次数。
登录后查看内容
此内容需要登录后才能查看,请先登录您的账户。
1级权限
需要 1 级或以上权限参考程序
cpp
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int a[N], b[N], n;
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; ++i) scanf("%d", &a[i]);
for (int i = 1; i <= n; ++i) scanf("%d", &b[i]);
sort(a + 1, a + n + 1);
sort(b + 1, b + n + 1);
int ans = 0, h = 1;
for (int i = 1; i <= n; ++i)
if (a[i] > b[h]) {
++ans;
++h;
}
printf("%d\n", ans);
return 0;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
